package P097_genericCanNotCovarianceOrContravariance;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * Desc:&emsp;&ensp;
 * @author 李渊&emsp;liyuan7@yusys.com.cn
 * @version 1.0
 * 
 */
public class Sub extends Base{
    // 返回更窄的类型，协变
    @Override
    public Integer doStuff() {
        return 0;
    }

    // 不属于复写，属于重载
    public void doStuff2(Number n) {
    }

    public static void main(String[] args) {
        // 宽变窄类型，协变
        Base base = new Sub();
        // 数组支持协变
        Number[] n = new Integer[10];
        // 泛型不支持协变，为了运行期的安全性，必须保证泛型参数类型固定
//        List<Number> ln = new ArrayList<Integer>();
        // 可以用通配符(wildcard)模拟协变，运行期仍然是确定的
        List<? extends Number> ln2 = new ArrayList<Integer>();

        // 泛型不支持逆变，模拟逆变
         List<? super Integer> ln3 = new ArrayList<Number>();


//        lnteger 是Number 的子类型？                             √
//        ArrayList<lnteger> 是List<lnteger> 的子类型？           √
//        lnteger[] 是Number[] 的子类型？                         √
//        List<Integer> 是List<Number> 的子类型？                 x
//        List<Integer> 是List<? extends lnteger> 的子类型？      x
//        List<lnteger> 是List<? super lnteger> 的子类型？        x
    }
}
